import os
from dataclasses import dataclass
from typing import List
from pathlib import Path

@dataclass
class Config:
    def __init__(self, test_mode: bool = True):
        self.TEST_MODE = test_mode
        
        # 基础配置
        self.PROJECT_ROOT = Path(__file__).parent.parent
        self.LOG_DIR = self.PROJECT_ROOT / "logs"
        self.DATA_DIR = self.PROJECT_ROOT / "data"
        
        # 创建必要目录
        self.LOG_DIR.mkdir(exist_ok=True)
        self.DATA_DIR.mkdir(exist_ok=True)
        
        # API配置和私钥 - 直接在代码中配置
        if test_mode:
            self.API_BASE_URL = "https://api.hyperliquid-testnet.xyz"
            # 主账户地址 (用于查询)
            self.MAIN_ACCOUNT_ADDRESS = "0x2a474536CF7A251860b031dA8168fA039705235a"
            # API钱包私钥 (用于签名交易)
            self.API_WALLET_PRIVATE_KEY = "0xdeab497eab80f19d8a0f0070a757dac53e827a6e9062634d7410a006d5d04b37"
            # API钱包地址
            self.API_WALLET_ADDRESS = "0x22bf67203b0ccee705327c258ae218b19d4becf4"
            # 为了兼容性，保留PRIVATE_KEY属性
            self.PRIVATE_KEY = self.API_WALLET_PRIVATE_KEY
            self.ACCOUNT_ADDRESS = self.MAIN_ACCOUNT_ADDRESS
        else:
            self.API_BASE_URL = "https://api.hyperliquid.xyz"
            # 主网私钥
            self.PRIVATE_KEY = "0x2639687aff674ed8c85b033d47b05a7c883eac3d420ce5c75c68c1f6dd2b8c45"
            self.ACCOUNT_ADDRESS = "0x41B8B9f6C61C23aaf5e46DADB46dAE6A7BC1E614"
            # 主网暂时使用相同的配置
            self.MAIN_ACCOUNT_ADDRESS = self.ACCOUNT_ADDRESS
            self.API_WALLET_PRIVATE_KEY = self.PRIVATE_KEY
            self.API_WALLET_ADDRESS = self.ACCOUNT_ADDRESS
        
        # 交易配置
        self.INITIAL_CAPITAL: float = 350.0 if test_mode else 101.0
        self.MAX_DAILY_LOSS: float = 40.0 if test_mode else 5.0  # 约5%的日损失限制
        self.MAX_POSITION_SIZE: float = 400.0 if test_mode else 50.0  # 约50%的最大持仓
        self.MAX_ORDER_SIZE: float = 80.0 if test_mode else 10.0  # 约10%的最大单笔订单
        
        # 执行配置
        self.EXECUTION_INTERVAL: int = 10 if test_mode else 30  # 测试网更频繁
        self.LOG_LEVEL: str = "DEBUG" if test_mode else "INFO"
        
        # API限流配置
        if test_mode:
            # 测试网限流更严格，需要更长间隔
            self.API_REQUEST_INTERVAL: float = 1.2  # 网格下单间隔（增加到1.2秒）
            self.API_PRICE_QUERY_INTERVAL: float = 0.8  # 价格查询间隔（增加到0.8秒）
            self.API_REBALANCE_INTERVAL: float = 1.5  # 重新平衡间隔（增加到1.5秒）
            self.API_MAX_RETRIES: int = 5  # 最大重试次数
            self.API_RETRY_BASE_DELAY: float = 2.0  # 重试基础延迟（增加到2.0秒）
            self.API_ORDER_BATCH_SIZE: int = 3  # 批量下单大小（减少到3个）
            self.API_ORDER_BATCH_DELAY: float = 3.0  # 批量下单间隔（增加到3.0秒）
        else:
            # 主网限流相对宽松
            self.API_REQUEST_INTERVAL: float = 0.3
            self.API_PRICE_QUERY_INTERVAL: float = 0.2
            self.API_REBALANCE_INTERVAL: float = 0.3
            self.API_MAX_RETRIES: int = 3
            self.API_RETRY_BASE_DELAY: float = 0.8
            self.API_ORDER_BATCH_SIZE: int = 5
            self.API_ORDER_BATCH_DELAY: float = 1.0
        
        # 交易模式配置
        self.TRADING_MODE: str = "spot"  # "spot" 或 "perpetual"
        self.TRADING_PAIR: str = "ETH-USDC"  # 默认交易对
        
        # 交易对筛选配置
        self.SYMBOL_FILTER_CONFIG = {
            'min_volume_24h': 100000.0,  # 最小24小时交易量（USDC）
            'min_price': 0.01,           # 最小价格
            'max_price': 100000.0,       # 最大价格
            'exclude_symbols': [],       # 排除的交易对列表
            'include_symbols': [],       # 强制包含的交易对列表（优先级最高）
            'max_symbols': 10,           # 最大交易对数量
            'sort_by': 'volume'          # 排序方式: 'volume', 'price', 'name'
        }
        
        # 网格交易策略配置
        self.ENABLE_GRID_STRATEGY: bool = True
        self.GRID_SIZE: float = 0.01 if test_mode else 0.005  # 测试网用更大网格
        self.GRID_COUNT: int = 10 if test_mode else 8  # 使用.env中的配置
        self.GRID_BASE_AMOUNT: float = 0.1 if test_mode else 5.0
        
        # 网格策略参数（兼容性）
        self.GRID_LEVELS: int = self.GRID_COUNT
        self.GRID_SPREAD: float = self.GRID_SIZE
        self.ORDER_AMOUNT: float = self.GRID_BASE_AMOUNT
        self.CENTER_PRICE_REFRESH_TIME: int = 300  # 5分钟
        
        # 资金费率套利策略配置
        self.ENABLE_FUNDING_STRATEGY: bool = False if test_mode else True  # 测试网先关闭
        self.MIN_FUNDING_RATE: float = 0.01 if test_mode else 0.01  # 使用.env中的配置
        self.FUNDING_POSITION_SIZE: float = 15.0 if test_mode else 20.0
        
        # 杠杆配置
        self.LEVERAGE_CONFIG = {
            'default_leverage': 3,      # 默认杠杆倍数
            'max_leverage': 10,         # 最大杠杆倍数
            'auto_set_leverage': True,  # 是否自动设置杠杆
            'leverage_by_symbol': {     # 按交易对设置杠杆
                # 'BTC': 5,
                # 'ETH': 3,
                # 'SOL': 2
            }
        }
        
        # 风险管理配置
        self.STOP_LOSS_PERCENTAGE: float = 0.05  # 5%止损
        self.MAX_DRAWDOWN: float = 0.15  # 15%最大回撤
        self.MAX_DAILY_LOSS_PCT: float = 0.05  # 5%日损失限制
        self.MAX_SINGLE_ORDER_PCT: float = 0.2 if test_mode else 0.1  # 单笔订单占总资产的最大比例
        
        # 策略分配配置
        self.STRATEGY_ALLOCATION = {
            'funding_arbitrage': 0.4,  # 40% 资金费率套利
            'grid_trading': 0.3,       # 30% 网格交易
            'momentum_trading': 0.2,   # 20% 趋势跟踪（预留）
            'reserve': 0.1             # 10% 资金储备
        }
        
        # 性能监控配置
        self.PERFORMANCE_UPDATE_INTERVAL: int = 10  # 性能更新间隔（秒）
        self.PERFORMANCE_CALCULATION_INTERVAL: int = 60  # 性能计算间隔（秒）
        self.EQUITY_CURVE_MAX_POINTS: int = 1000  # 权益曲线最大数据点
        
        # 通知系统配置
        self.NOTIFICATION_CONFIG = {
            # 邮件配置
            'email_enabled': False,
            'smtp_server': 'smtp.gmail.com',
            'smtp_port': 587,
            'email_user': '',  # 需要用户配置
            'email_password': '',  # 需要用户配置
            'recipient_emails': [],  # 需要用户配置
            
            # Webhook配置
            'webhook_enabled': False,
            'webhook_urls': [],  # 需要用户配置
            
            # 文件配置
            'file_enabled': True,
            'log_file_path': str(self.LOG_DIR / 'notifications.log'),
            
            # WebSocket配置 (禁用，使用web_interface的WebSocket)
            'websocket_enabled': False,
            'websocket_port': 8765,
            
            # 通知阈值
            'min_profit_threshold': 10.0,  # 最小盈利通知阈值
            'min_loss_threshold': -20.0,   # 最小亏损通知阈值
            'risk_alert_enabled': True,
            'daily_summary_enabled': True
        }
        
        # 策略分配器配置
        self.ALLOCATOR_CONFIG = {
            'rebalance_threshold': 0.05,  # 5%偏差触发重新平衡
            'performance_window': 7,      # 7天性能评估窗口
            'check_interval': 300,        # 5分钟检查间隔
            'min_allocation_change': 0.02  # 最小分配变化阈值
        }
        
        # 验证配置
        self._validate_config()
    
    def _validate_config(self):
        """验证配置"""
        # 检查API钱包私钥
        if not hasattr(self, 'API_WALLET_PRIVATE_KEY') or not self.API_WALLET_PRIVATE_KEY:
            raise ValueError(f"API钱包私钥未配置，请检查settings.py中的API_WALLET_PRIVATE_KEY设置")
        
        if not self.API_WALLET_PRIVATE_KEY.startswith('0x'):
            raise ValueError("API钱包私钥必须以0x开头")
            
        if len(self.API_WALLET_PRIVATE_KEY) != 66:  # 0x + 64位十六进制
            raise ValueError(f"API钱包私钥长度不正确，应为66位（包含0x前缀），当前长度：{len(self.API_WALLET_PRIVATE_KEY)}")
        
        # 检查主账户地址
        if not hasattr(self, 'MAIN_ACCOUNT_ADDRESS') or not self.MAIN_ACCOUNT_ADDRESS:
            raise ValueError(f"主账户地址未配置，请检查settings.py中的MAIN_ACCOUNT_ADDRESS设置")
        
        if self.MAX_ORDER_SIZE > self.MAX_POSITION_SIZE:
            raise ValueError("最大订单大小不能超过最大持仓大小")
        
        if self.MAX_DAILY_LOSS > self.INITIAL_CAPITAL * 0.5:
            raise ValueError("最大日损失不应超过初始资金的50%")